#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>

int cnt = 0;
int DirCount(char* dirname) {
    printf("%s\n", dirname);

    // 打开目录，如果是普通文件，则计数，否则递归
    DIR* dirp = opendir(dirname);
    if(dirp == NULL) {
        perror("opendir error!");
        return -1;
    }
    
    struct dirent* dentp = NULL;
    while((dentp = readdir(dirp)) != NULL) {   // 为空代表读到目录末尾
        // printf("dirname: %s, dtype: %d\n", dentp->d_name, dentp->d_type);

        if(dentp->d_type == DT_DIR) {
            if(strcmp(".", dentp->d_name) == 0 || strcmp("..", dentp->d_name) == 0) {
                continue;
            }
            
            // 注意进程工作路径，不能直接打开子目录
            // 使用 dirname 拼接下一级子目录
            char newdirname[256] = {0};
            sprintf(newdirname, "%s/%s", dirname, dentp->d_name);
            DirCount(newdirname);
        }

        // 如果是普通文件，则开始计数
        if(dentp->d_type == DT_REG) {
            cnt++;
            printf("dname: %s\n", dentp->d_name);
        }
    }

    closedir(dirp);
    return 0;
}

int main(int argc, char* argv[])
{
    if(argc != 2) {
        printf("argument number error\n");
        exit(1);
    }
    
    DirCount(argv[1]);
    printf("%d\n", cnt);

    return 0;
}

